import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * class Jugador
 * @author (Santos Miranda Luis Gerardo) 
 * @author (Lopez Rangel Arturo)
 */
public class Jugador extends Actor
{
    private int color_pisado;//Indica el color del cubo que es pisado
    private int contadorCombo;//Lleva el conteo para los combos
    private int ant_pisado;//Indica cual fue el color del cubo pisado con anterioridad
    private GreenfootSound salto;//Sonido para los saltos de Luigi
    private GreenfootSound explosion;//Sonido para la explosion de los cubos
    private int it;//Iterador usado para el descenso de los cubos
    private int m;//Variable para subir a Luigi
    private Combo combo;//Variable para guardar la imagen del combo realizado
    private int X;//Varible usada para los for del descenso de los cubos
    private boolean banderasalto;//Bandera para el salto (ascender o descender)
    private int cont;//Contador para el ascenso de Luigi

    /**
     * Constructor class Jugador
     */
    public Jugador()
    {
        contadorCombo=0;
        ant_pisado=0;
        salto= new GreenfootSound("salto.mp3");
        explosion=new GreenfootSound("explosion2.mp3");
        explosion.setVolume(15);
        salto.setVolume(15);
        it=0;
        banderasalto=false;
        cont=0;
    }

    /**
     * Act class Jugador
     */
    public void act() 
    {  
        if(Greenfoot.isKeyDown("left") && checa_izquierda())
        {  
            this.move(-1);
        }

        if(Greenfoot.isKeyDown("right") && this.getX()<8 && checa_derecha())
            this.move(1);

        if(banderasalto==false)
        {    if(this.checa_abajo())//Si es true, quiere decir que abajo hay cubo
            {
                this.destruye_cubo();
                salto.play();
                this.setImage("luigi2.png");
                banderasalto=true;//this.asciende();
            }
            else
            if(this.getY()==11)
            {
                salto.play();
                banderasalto=true;

            }
            else
                this.desciende();
        }
        else//Quiere decir que bandera es TRUE
        {
             if(cont++<4)
                this.asciende();
             else
             {banderasalto=false; this.setImage("luigi.png"); cont=0;}
                 
        }

            
    }

    /**
     * Destroy cubes
     */
    public void destruye_cubo()
    {
        Cubo cubo=new Cubo();
        Cubo aux=new Cubo();
        java.util.List<Cubo> Lista=getWorld().getObjectsAt(this.getX(),this.getY()+1,Cubo.class);
        if(!Lista.isEmpty())
        {
            cubo=Lista.get(0);
            aux=cubo;
        }
        if(cubo!=null)
        {
            aux=(Cubo)cubo;
            Escenario mundo;
            mundo = (Escenario)getWorld();
            color_pisado=aux.checaColor();// Aqui se llama al metodo checa color enviandole como parametro el 1 (valor que representa la imagen amarilla)

            if(ant_pisado==color_pisado)
            {
                mundo.aumentaPuntos();
                contadorCombo=contadorCombo+1;
            }
            else
            {
                if(contadorCombo==3)
                {
                    combo1(cubo.getY());
                    contadorCombo=0;
                }
                else if(contadorCombo==4)
                {
                    combo2(cubo.getY());
                    contadorCombo=0;
                }
                else if(contadorCombo>=5)
                {
                    combo3(cubo.getY());
                    contadorCombo=0;
                }
                else
                {
                    contadorCombo=1;
                    mundo.borraCombo();
                    mundo.aumentaPuntos();
                    ant_pisado=color_pisado;
                }
            }
            mundo.dibujaCombo(color_pisado,contadorCombo);
            mundo.removeObject(cubo);
        }
    }

    /**
     * Increase Luigi position in the X coordinate
     */
    public void asciende()
    { 
        this.setLocation(this.getX(),this.getY()-1);
    }

    /**
     * Decrease Luigi position in the X coordinate
     */
    public void desciende()
    { 
        this.setLocation(this.getX(),this.getY()+1);
    }

    /**
     * Check for cubes down of Luigi
     */
    public boolean checa_abajo()
    {
        java.util.List<Cubo> Lista=getWorld().getObjectsAt(this.getX(),this.getY()+1,Cubo.class);
        if(Lista.isEmpty())
            return false;//False=No existe cubo
        else 
            return true;//True=Existe un Cubo
    }  

    /**
     * Check for cubes left of Luigi
     */
    public boolean checa_izquierda()
    {
        java.util.List<Cubo> Lista=getWorld().getObjectsAt(this.getX()-1,this.getY(),Cubo.class);
        if(!Lista.isEmpty())
            return false;//False=No existe cubo
        else 
            return true;//True=Existe un Cubo
    }  

    /**
     * Check for cubes right of Luigi
     */
    public boolean checa_derecha()
    {
        java.util.List<Cubo> Lista=getWorld().getObjectsAt(this.getX()+1,this.getY(),Cubo.class);
        if(!Lista.isEmpty())
            return false;//False=No existe cubo
        else 
            return true;//True=Existe un Cubo
    }  

    /**
     * Destroy row of cubes
     */
    public void destruyeFila(int posY)
    {
        Actor cubo;
        Cubo otrocubo;
        Cubo Aux;
        Escenario mundo;
        mundo=(Escenario)getWorld();
        for(int i=0;i<9;i++)
        {
            java.util.List<Actor> listaCubos=mundo.getObjectsAt(i, posY, Cubo.class);   
            if(!listaCubos.isEmpty())
            {     
                cubo= (Actor) listaCubos.get(0);
                cubo.setImage("explo1.png"); 
                cubo.setImage("explo2.png");
                cubo.setImage("explo3.png");
                cubo.setImage("explo4.png");
                cubo.setImage("explo5.png");
                cubo.setImage("explo6.png");
                cubo.setImage("explo7.png");
                cubo.setImage("explo8.png");
                cubo.setImage("explo9.png");
                cubo.setImage("explo10.png");
                cubo.setImage("explo11.png");
                cubo.setImage("explo12.png");
                Greenfoot.delay(1);
                explosion.play();
                mundo.removeObject(cubo); 
                mundo.aumentaPuntos();
            }
        } 

    }

    /**
     * Down cubes
     */
    public void desciende_cubos(int posY)
    {
        Cubo otrocubo;
        Escenario mundo;
        mundo=(Escenario)getWorld();
        if(posY<10)//por que hasta el 9 no hay problema los problemas vienen apartir del 10
            this.bajaCubos_Combo1(posY);

        if(posY==10)
            this.bajaCubos_Combo2(posY);

        if(posY==11)
            this.bajaCubos_Combo3(posY);    

    }

    /**
     * Run combo 1
     */
    public void combo1(int posY)
    {
        Escenario mundo;
        mundo = (Escenario)getWorld();
        combo=new Combo();
        combo.setImage("combo1.png");
        mundo.addObject(combo,4,5);
        this.destruyeFila(posY);
        this.desciende_cubos(posY);
        mundo.borraCombo();
        mundo.removeObject(combo);
    }

    /**
     * Run combo 2
     */
    public void combo2(int posY)
    {
        Escenario mundo;
        mundo = (Escenario)getWorld();
        combo=new Combo();
        combo.setImage("combo2.png");
        mundo.addObject(combo,4,5);
        this.destruyeFila(posY);
        if(posY+1<12)
            this.destruyeFila(posY+1);
        this.desciende_cubos(posY);
        mundo.borraCombo();
        mundo.removeObject(combo);
    }

    /**
     * Run combo 3
     */
    public void combo3(int posY)
    {
        Escenario mundo;
        mundo = (Escenario)getWorld();
        combo=new Combo();
        combo.setImage("combo3.png");
        mundo.addObject(combo,4,5);
        this.destruyeFila(posY);
        if(posY+1<12)
            this.destruyeFila(posY+1);
        if(posY+2<12)  
            this.destruyeFila(posY+2);
        this.desciende_cubos(posY); 
        mundo.borraCombo();
        mundo.removeObject(combo);
    }

    /**
     * Down cubes for combo1
     */
    public void bajaCubos_Combo1(int posY)
    {
        Cubo otrocubo;
        Escenario mundo;
        mundo=(Escenario)getWorld();
        for(X=0;X<9;X++)
        {  for(int j=0;j<posY;j++)
            {
                java.util.List<Actor> otralistaCubos=mundo.getObjectsAt(X,j,Cubo.class);
                if(!otralistaCubos.isEmpty())
                {
                    if(contadorCombo==3)
                    {
                        otrocubo=(Cubo)otralistaCubos.get(0);
                        otrocubo.desciende(1);
                    }
                    if(contadorCombo==4)
                    {
                        otrocubo=(Cubo)otralistaCubos.get(0);
                        otrocubo.desciende(2);
                    }
                    if(contadorCombo>=5)
                    {
                        otrocubo=(Cubo)otralistaCubos.get(0);
                        otrocubo.desciende(3);
                    }
                }  
            }
        }
    }

    /**
     * Down cubes for combo2
     */
    public void bajaCubos_Combo2(int posY)
    {
        Cubo otrocubo;
        Escenario mundo;
        mundo=(Escenario)getWorld();
        for(X=0;X<9;X++)
        {  for(int j=0;j<posY;j++)
            {
                java.util.List<Actor> otralistaCubos=mundo.getObjectsAt(X,j,Cubo.class);
                if(!otralistaCubos.isEmpty())
                {
                    if(contadorCombo==3)
                    {
                        otrocubo=(Cubo)otralistaCubos.get(0);
                        otrocubo.desciende(1);
                    }
                    if(contadorCombo==4)
                    {
                        otrocubo=(Cubo)otralistaCubos.get(0);
                        otrocubo.desciende(2);
                    }
                    if(contadorCombo>=5)
                    {
                        otrocubo=(Cubo)otralistaCubos.get(0);
                        otrocubo.desciende(2);
                    }
                }  
            }
        }
    }

    /**
     * Down cubes for combo3
     */
    public void bajaCubos_Combo3(int posY)
    {
        Cubo otrocubo;
        Escenario mundo;
        mundo=(Escenario)getWorld();
        for(X=0;X<9;X++)
        {  for(int j=0;j<posY;j++)
            {
                java.util.List<Actor> otralistaCubos=mundo.getObjectsAt(X,j,Cubo.class);
                if(!otralistaCubos.isEmpty())
                {
                    if(contadorCombo==3)
                    {
                        otrocubo=(Cubo)otralistaCubos.get(0);
                        otrocubo.desciende(1);
                    }
                    if(contadorCombo==4)
                    {
                        otrocubo=(Cubo)otralistaCubos.get(0);
                        otrocubo.desciende(1);
                    }
                    if(contadorCombo>=5)
                    {
                        otrocubo=(Cubo)otralistaCubos.get(0);
                        otrocubo.desciende(1);
                    }
                }  
            } 
        }
    }
}
